#模块
include Math
print PI,sqrt(2),"\n"

#创建模块
module HelloModule
    Version="1.10"
    def hello(name)
        "Hello,#{name}"
    end
    module_function:hello #作为模块函数对外，无法作为Mix-in的实例方法
end
print HelloModule::Version,HelloModule.hello("张天泽"),"\n"
include HelloModule
print Version,hello("李立平"),"\n"

# Mix-in
class HelloWorld
    include HelloModule #其中方法作为实例方法，module_function的方法不能成为实例方法
end

p1=HelloWorld.new
#p p1.hello("name")
#查找方法的顺序
=begin
1.子类，2.模块，3.父类
Mix-in时的顺序：
1.原类中同名方法，优先使用原方法
2.多个模块优先使用最后一个模块
3.同一模块被包含两次以上时，第二次以后会被省略
4.嵌套include时，按上述顺序线性
=end

# extends
#使单例类包含模块
module Edition
    def edition(n)
        "Version:#{n}"
    end
end

str1="张天泽"
str1.extend(Edition)
p str1.edition(10)

#类与Mix-in
#类本身也是Class类的对象，类方法相当于类对象的实例方法
class HelloClass
    extend Edition #定义类方法
    include HelloModule #实例方法
end
p HelloClass.edition(1)